using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Raster._RasterProcessing
{
    /// <summary>
    /// <para>Create Ortho Corrected Raster Dataset</para>
    /// <para>Creates an orthocorrected raster dataset by incorporating  elevation data and the rational polynomial coefficients (RPC) associated with satellite data  to accurately line up imagery.</para>
    /// <para>通过合并高程数据和与卫星数据关联的有理多项式系数 （RPC） 来创建正交校正栅格数据集，以准确排列影像。</para>
    /// </summary>    
    [DisplayName("Create Ortho Corrected Raster Dataset")]
    public class CreateOrthoCorrectedRasterDataset : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public CreateOrthoCorrectedRasterDataset()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_raster">
        /// <para>Input Raster</para>
        /// <para>The raster dataset to orthorectify. The raster must have RPCs in its metadata.</para>
        /// <para>要正射校正的栅格数据集。栅格的元数据中必须包含 RPC。</para>
        /// </param>
        /// <param name="_out_raster_dataset">
        /// <para>Output Raster Dataset</para>
        /// <para><xdoc>
        ///   <para>The name, location, and format of the dataset to be created.</para>
        ///   <para>When storing the raster dataset in a file format, you need to specify the file extension:</para>
        ///   <bulletList>
        ///     <bullet_item>.bil—Esri BIL</bullet_item><para/>
        ///     <bullet_item>.bip—Esri BIP</bullet_item><para/>
        ///     <bullet_item>.bmp—BMP</bullet_item><para/>
        ///     <bullet_item>.bsq—Esri BSQ</bullet_item><para/>
        ///     <bullet_item>.dat—ENVI DAT</bullet_item><para/>
        ///     <bullet_item>.gif—GIF</bullet_item><para/>
        ///     <bullet_item>.img—ERDAS IMAGINE</bullet_item><para/>
        ///     <bullet_item>.jpg—JPEG</bullet_item><para/>
        ///     <bullet_item>.jp2—JPEG 2000</bullet_item><para/>
        ///     <bullet_item>.png—PNG</bullet_item><para/>
        ///     <bullet_item>.tif—TIFF</bullet_item><para/>
        ///     <bullet_item>.mrf—MRF</bullet_item><para/>
        ///     <bullet_item>.crf—CRF</bullet_item><para/>
        ///     <bullet_item>No extension for Esri Grid</bullet_item><para/>
        ///   </bulletList>
        ///   <para>When storing a raster dataset in a geodatabase, do not add a file extension to the name of the raster dataset.</para>
        ///   <para>When storing your raster dataset to a JPEG file, a JPEG 2000 file, or a geodatabase, you can specify a Compression Type and Compression Quality in the Environments.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要创建的数据集的名称、位置和格式。</para>
        ///   <para>以文件格式存储栅格数据集时，需要指定文件扩展名：</para>
        ///   <bulletList>
        ///     <bullet_item>.bil - Esri BIL</bullet_item><para/>
        ///     <bullet_item>.bip - Esri BIP</bullet_item><para/>
        ///     <bullet_item>.bmp—BMP</bullet_item><para/>
        ///     <bullet_item>.bsq—Esri BSQ</bullet_item><para/>
        ///     <bullet_item>.dat—ENVI DAT</bullet_item><para/>
        ///     <bullet_item>.gif—GIF</bullet_item><para/>
        ///     <bullet_item>.img—ERDAS 想象</bullet_item><para/>
        ///     <bullet_item>.jpg - JPEG</bullet_item><para/>
        ///     <bullet_item>.jp2 - JPEG 2000</bullet_item><para/>
        ///     <bullet_item>.png—PNG</bullet_item><para/>
        ///     <bullet_item>.tif—TIFF</bullet_item><para/>
        ///     <bullet_item>.mrf - MRF</bullet_item><para/>
        ///     <bullet_item>.crf - CRF</bullet_item><para/>
        ///     <bullet_item>没有 Esri Grid 的扩展模块</bullet_item><para/>
        ///   </bulletList>
        ///   <para>在地理数据库中存储栅格数据集时，请勿在栅格数据集的名称中添加文件扩展名。</para>
        ///   <para>将栅格数据集存储到 JPEG 文件、JPEG 2000 文件或地理数据库时，可以在环境中指定压缩类型和压缩质量。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_Ortho_type">
        /// <para>Orthorectification Type</para>
        /// <para><xdoc>
        ///   <para>The DEM or specified value that represents the average elevation across the image.</para>
        ///   <bulletList>
        ///     <bullet_item>Constant elevation—A specified elevation value will be used.</bullet_item><para/>
        ///     <bullet_item>DEM—A specified digital elevation model raster will be used.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>表示整个图像的平均高程的 DEM 或指定值。</para>
        ///   <bulletList>
        ///     <bullet_item>恒定高程—将使用指定的高程值。</bullet_item><para/>
        ///     <bullet_item>DEM—将使用指定的数字高程模型栅格。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_constant_elevation">
        /// <para>Constant Elevation (Meters)</para>
        /// <para><xdoc>
        ///   <para>The constant elevation value to be used when the Orthorectification Type parameter is Constant elevation.</para>
        ///   <para>If a DEM is used in the orthocorrection process, this value is not used.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>正射校正类型参数为恒定高程时要使用的恒定高程值。</para>
        ///   <para>如果在正射校正过程中使用 DEM，则不使用此值。</para>
        /// </xdoc></para>
        /// </param>
        public CreateOrthoCorrectedRasterDataset(object _in_raster, object _out_raster_dataset, _Ortho_type_value? _Ortho_type, double? _constant_elevation)
        {
            this._in_raster = _in_raster;
            this._out_raster_dataset = _out_raster_dataset;
            this._Ortho_type = _Ortho_type;
            this._constant_elevation = _constant_elevation;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Create Ortho Corrected Raster Dataset";

        public override string CallName => "management.CreateOrthoCorrectedRasterDataset";

        public override List<string> AcceptEnvironments => ["compression", "configKeyword", "extent", "geographicTransformations", "nodata", "outputCoordinateSystem", "parallelProcessingFactor", "pyramid", "rasterStatistics", "resamplingMethod", "scratchWorkspace", "snapRaster", "tileSize", "workspace"];

        public override object[] ParameterInfo => [_in_raster, _out_raster_dataset, _Ortho_type.GetGPValue(), _constant_elevation, _in_DEM_raster, _ZFactor, _ZOffset, _Geoid.GetGPValue()];

        /// <summary>
        /// <para>Input Raster</para>
        /// <para>The raster dataset to orthorectify. The raster must have RPCs in its metadata.</para>
        /// <para>要正射校正的栅格数据集。栅格的元数据中必须包含 RPC。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_raster { get; set; }


        /// <summary>
        /// <para>Output Raster Dataset</para>
        /// <para><xdoc>
        ///   <para>The name, location, and format of the dataset to be created.</para>
        ///   <para>When storing the raster dataset in a file format, you need to specify the file extension:</para>
        ///   <bulletList>
        ///     <bullet_item>.bil—Esri BIL</bullet_item><para/>
        ///     <bullet_item>.bip—Esri BIP</bullet_item><para/>
        ///     <bullet_item>.bmp—BMP</bullet_item><para/>
        ///     <bullet_item>.bsq—Esri BSQ</bullet_item><para/>
        ///     <bullet_item>.dat—ENVI DAT</bullet_item><para/>
        ///     <bullet_item>.gif—GIF</bullet_item><para/>
        ///     <bullet_item>.img—ERDAS IMAGINE</bullet_item><para/>
        ///     <bullet_item>.jpg—JPEG</bullet_item><para/>
        ///     <bullet_item>.jp2—JPEG 2000</bullet_item><para/>
        ///     <bullet_item>.png—PNG</bullet_item><para/>
        ///     <bullet_item>.tif—TIFF</bullet_item><para/>
        ///     <bullet_item>.mrf—MRF</bullet_item><para/>
        ///     <bullet_item>.crf—CRF</bullet_item><para/>
        ///     <bullet_item>No extension for Esri Grid</bullet_item><para/>
        ///   </bulletList>
        ///   <para>When storing a raster dataset in a geodatabase, do not add a file extension to the name of the raster dataset.</para>
        ///   <para>When storing your raster dataset to a JPEG file, a JPEG 2000 file, or a geodatabase, you can specify a Compression Type and Compression Quality in the Environments.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要创建的数据集的名称、位置和格式。</para>
        ///   <para>以文件格式存储栅格数据集时，需要指定文件扩展名：</para>
        ///   <bulletList>
        ///     <bullet_item>.bil - Esri BIL</bullet_item><para/>
        ///     <bullet_item>.bip - Esri BIP</bullet_item><para/>
        ///     <bullet_item>.bmp—BMP</bullet_item><para/>
        ///     <bullet_item>.bsq—Esri BSQ</bullet_item><para/>
        ///     <bullet_item>.dat—ENVI DAT</bullet_item><para/>
        ///     <bullet_item>.gif—GIF</bullet_item><para/>
        ///     <bullet_item>.img—ERDAS 想象</bullet_item><para/>
        ///     <bullet_item>.jpg - JPEG</bullet_item><para/>
        ///     <bullet_item>.jp2 - JPEG 2000</bullet_item><para/>
        ///     <bullet_item>.png—PNG</bullet_item><para/>
        ///     <bullet_item>.tif—TIFF</bullet_item><para/>
        ///     <bullet_item>.mrf - MRF</bullet_item><para/>
        ///     <bullet_item>.crf - CRF</bullet_item><para/>
        ///     <bullet_item>没有 Esri Grid 的扩展模块</bullet_item><para/>
        ///   </bulletList>
        ///   <para>在地理数据库中存储栅格数据集时，请勿在栅格数据集的名称中添加文件扩展名。</para>
        ///   <para>将栅格数据集存储到 JPEG 文件、JPEG 2000 文件或地理数据库时，可以在环境中指定压缩类型和压缩质量。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Raster Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_raster_dataset { get; set; }


        /// <summary>
        /// <para>Orthorectification Type</para>
        /// <para><xdoc>
        ///   <para>The DEM or specified value that represents the average elevation across the image.</para>
        ///   <bulletList>
        ///     <bullet_item>Constant elevation—A specified elevation value will be used.</bullet_item><para/>
        ///     <bullet_item>DEM—A specified digital elevation model raster will be used.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>表示整个图像的平均高程的 DEM 或指定值。</para>
        ///   <bulletList>
        ///     <bullet_item>恒定高程—将使用指定的高程值。</bullet_item><para/>
        ///     <bullet_item>DEM—将使用指定的数字高程模型栅格。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Orthorectification Type")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _Ortho_type_value? _Ortho_type { get; set; }

        public enum _Ortho_type_value
        {
            /// <summary>
            /// <para>Constant elevation</para>
            /// <para>Constant elevation—A specified elevation value will be used.</para>
            /// <para>恒定高程—将使用指定的高程值。</para>
            /// </summary>
            [Description("Constant elevation")]
            [GPEnumValue("CONSTANT_ELEVATION")]
            _CONSTANT_ELEVATION,

            /// <summary>
            /// <para>DEM</para>
            /// <para>DEM—A specified digital elevation model raster will be used.</para>
            /// <para>DEM—将使用指定的数字高程模型栅格。</para>
            /// </summary>
            [Description("DEM")]
            [GPEnumValue("DEM")]
            _DEM,

        }

        /// <summary>
        /// <para>Constant Elevation (Meters)</para>
        /// <para><xdoc>
        ///   <para>The constant elevation value to be used when the Orthorectification Type parameter is Constant elevation.</para>
        ///   <para>If a DEM is used in the orthocorrection process, this value is not used.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>正射校正类型参数为恒定高程时要使用的恒定高程值。</para>
        ///   <para>如果在正射校正过程中使用 DEM，则不使用此值。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Constant Elevation (Meters)")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public double? _constant_elevation { get; set; }


        /// <summary>
        /// <para>DEM Raster</para>
        /// <para>The DEM raster to be used for orthorectification when the Orthorectification Type parameter is DEM</para>
        /// <para>当正射校正类型参数为 DEM 时，用于正射校正的 DEM 栅格</para>
        /// <para></para>
        /// </summary>
        [DisplayName("DEM Raster")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_DEM_raster { get; set; } = null;


        /// <summary>
        /// <para>Z Factor</para>
        /// <para><xdoc>
        ///   <para>The scaling factor used to convert the elevation values in the DEM.</para>
        ///   <para>If your vertical units are meters, set the Z Factor to 1. If your vertical units are feet, set the Z Factor to 0.3048. If any other vertical units are used, use the Z Factor to scale the units to meters.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于转换 DEM 中的高程值的比例因子。</para>
        ///   <para>如果垂直单位为米，请将 Z 因子设置为 1。如果垂直单位为英尺，请将 Z 因子设置为 0.3048。如果使用任何其他垂直单位，请使用 Z 因子将单位缩放为米。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Factor")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _ZFactor { get; set; } = 1;


        /// <summary>
        /// <para>Z Offset</para>
        /// <para>The base value to be added to the elevation value in the DEM. This can be used to offset elevation values that do not start at sea level.</para>
        /// <para>要添加到 DEM 中的高程值的基值。这可用于偏移不从海平面开始的高程值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Offset")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _ZOffset { get; set; } = 0;


        /// <summary>
        /// <para>Geoid</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the geoid correction required by RPCs that reference ellipsoidal heights will be made. Most elevation datasets are referenced to sea level orthometric heights, so this correction is required in these cases to convert to ellipsoidal heights.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—No geoid correction is made. Use this option only if your DEM is already expressed in ellipsoidal heights.</bullet_item><para/>
        ///     <bullet_item>Checked—A geoid correction will be made to convert orthometric heights to ellipsoidal heights (based on EGM96 geoid).</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否进行参考椭球体高度的 RPC 所需的大地水准面校正。大多数高程数据集都参考了海平面正高，因此在这些情况下需要进行此校正才能转换为椭球体高度。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 不进行大地水准面校正。仅当 DEM 已以椭球体高度表示时，才使用此选项。</bullet_item><para/>
        ///     <bullet_item>选中—将进行大地水准面校正以将正高转换为椭球体高度（基于 EGM96 大地水准面）。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Geoid")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _Geoid_value _Geoid { get; set; } = _Geoid_value._false;

        public enum _Geoid_value
        {
            /// <summary>
            /// <para>GEOID</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("GEOID")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NONE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NONE")]
            [GPEnumValue("false")]
            _false,

        }

        public CreateOrthoCorrectedRasterDataset SetEnv(object compression = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object nodata = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object pyramid = null, object rasterStatistics = null, object resamplingMethod = null, object scratchWorkspace = null, object snapRaster = null, double[] tileSize = null, object workspace = null)
        {
            base.SetEnv(compression: compression, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, nodata: nodata, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, pyramid: pyramid, rasterStatistics: rasterStatistics, resamplingMethod: resamplingMethod, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, tileSize: tileSize, workspace: workspace);
            return this;
        }

    }

}